#ifndef HAFFMAN_TREE_H
#define HAFFMAN_TREE_H

#include <iostream>
#include <string>
#include <vector>
using namespace std;

struct Node {
	int power; //结点的权值
	Node* lchild,
		* rchild;// 左右子树
};

class HuffmanTree {
public:
	const int& PWL; //树的权值（只读）
	const vector<int>& powers; //权值数组（只读）
	const vector<string>& codes; //编码数组（只读）

	HuffmanTree();
	~HuffmanTree();
	void Create(); //创建哈夫曼树
private:
	vector<Node*> _forest;//哈夫曼森林
	vector<int> _powers; //权值数组
	vector<string> _codes;//编码数组
	int _pwl; //树的权值

	void Release(Node*); //递归销毁树
	void Coding(Node*, const string&); //递归编码
	void AddNode(Node* s);//将结点 s 加入到森林(链表)，并确保链表各结点的权值是从小到大排列
};
#endif
